From: Ian.Campbell@xensource.com Date: Fri, 27 Jan 2006 11:31:14 +0000 (+0000) Subject: Introduce XENFEAT_writable_mmu_structures. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16523^2~1 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22?a=commitdiff_plain;h=18acd247dfb4307548fe52c4e3c823303a6b1187;p=xen.git Introduce XENFEAT_writable_mmu_structures. This feature flag indicates to the guest that it is allowable to use writable LDT, GDT and page table pages. Signed-off-by: Ian Campbell Index: xen-features/xen/include/public/version.h =================================================================== --- xen-features.orig/xen/include/public/version.h 2006-01-27 11:27:14.000000000 +0000 +++ xen-features/xen/include/public/version.h 2006-01-27 11:27:14.000000000 +0000 @@ -45,6 +45,9 @@ uint32_t submap; /* OUT: 32-bit submap */ } xen_feature_info_t; +#define _XENFEAT_writable_mmu_structures 0 +#define XENFEAT_writable_mmu_structures (1UL<<_XENFEAT_writable_mmu_structures) + #define XENFEAT_NR_SUBMAPS 1 #endif /* __XEN_PUBLIC_VERSION_H__ */ Index: xen-features/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c =================================================================== --- xen-features.orig/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c 2006-01-27 11:27:14.000000000 +0000 +++ xen-features/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c 2006-01-27 11:27:14.000000000 +0000 @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -391,24 +392,42 @@ #ifndef CONFIG_XEN_SHADOW_MODE void make_lowmem_mmu_page_readonly(void *va) { - pte_t *pte = virt_to_ptep(va); - int rc = HYPERVISOR_update_va_mapping( + pte_t *pte; + int rc; + + if (xen_feature(writable_mmu_structures)) + return; + + pte = virt_to_ptep(va); + rc = HYPERVISOR_update_va_mapping( (unsigned long)va, pte_wrprotect(*pte), 0); BUG_ON(rc); } void make_lowmem_mmu_page_writable(void *va) { - pte_t *pte = virt_to_ptep(va); - int rc = HYPERVISOR_update_va_mapping( + pte_t *pte; + int rc; + + if (xen_feature(writable_mmu_structures)) + return; + + pte = virt_to_ptep(va); + rc = HYPERVISOR_update_va_mapping( (unsigned long)va, pte_mkwrite(*pte), 0); BUG_ON(rc); } void make_mmu_page_readonly(void *va) { - pte_t *pte = virt_to_ptep(va); - int rc = HYPERVISOR_update_va_mapping( + pte_t *pte; + int rc; + + if (xen_feature(writable_mmu_structures)) + return; + + pte = virt_to_ptep(va); + rc = HYPERVISOR_update_va_mapping( (unsigned long)va, pte_wrprotect(*pte), 0); if (rc) /* fallback? */ xen_l1_entry_update(pte, pte_wrprotect(*pte)); @@ -426,8 +445,14 @@ void make_mmu_page_writable(void *va) { - pte_t *pte = virt_to_ptep(va); - int rc = HYPERVISOR_update_va_mapping( + pte_t *pte; + int rc; + + if (xen_feature(writable_mmu_structures)) + return; + + pte = virt_to_ptep(va); + rc = HYPERVISOR_update_va_mapping( (unsigned long)va, pte_mkwrite(*pte), 0); if (rc) /* fallback? */ xen_l1_entry_update(pte, pte_mkwrite(*pte)); @@ -443,6 +468,9 @@ void make_mmu_pages_readonly(void *va, unsigned int nr) { + if (xen_feature(writable_mmu_structures)) + return; + while (nr-- != 0) { make_mmu_page_readonly(va); va = (void *)((unsigned long)va + PAGE_SIZE); @@ -451,6 +479,8 @@ void make_mmu_pages_writable(void *va, unsigned int nr) { + if (xen_feature(writable_mmu_structures)) + return; while (nr-- != 0) { make_mmu_page_writable(va); va = (void *)((unsigned long)va + PAGE_SIZE); Index: xen-features/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c =================================================================== --- xen-features.orig/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c 2006-01-27 11:27:14.000000000 +0000 +++ xen-features/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c 2006-01-27 11:27:18.000000000 +0000 @@ -40,6 +40,8 @@ #include #include +#include + #ifndef Dprintk #define Dprintk(x...) #endif @@ -72,6 +74,9 @@ pte_t pte, *ptep; unsigned long *page = (unsigned long *) init_level4_pgt; + if (xen_feature(writable_mmu_structures)) + return; + addr = (unsigned long) page[pgd_index(_va)]; addr_to_page(addr, page); @@ -93,6 +98,9 @@ pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep; unsigned long addr = (unsigned long) va; + if (xen_feature(writable_mmu_structures)) + return; + pgd = pgd_offset_k(addr); pud = pud_offset(pgd, addr); pmd = pmd_offset(pud, addr); @@ -111,6 +119,9 @@ pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep; unsigned long addr = (unsigned long) va; + if (xen_feature(writable_mmu_structures)) + return; + pgd = pgd_offset_k(addr); pud = pud_offset(pgd, addr); pmd = pmd_offset(pud, addr); @@ -126,6 +137,9 @@ void make_mmu_pages_readonly(void *va, unsigned nr) { + if (xen_feature(writable_mmu_structures)) + return; + while (nr-- != 0) { make_mmu_page_readonly(va); va = (void*)((unsigned long)va + PAGE_SIZE); @@ -134,6 +148,8 @@ void make_mmu_pages_writable(void *va, unsigned nr) { + if (xen_feature(writable_mmu_structures)) + return; while (nr-- != 0) { make_mmu_page_writable(va); va = (void*)((unsigned long)va + PAGE_SIZE); @@ -385,6 +401,9 @@ { int readonly = 0; + if (xen_feature(writable_mmu_structures)) + return 0; + /* Make old and new page tables read-only. */ if ((paddr >= (xen_start_info->pt_base - __START_KERNEL_map)) && (paddr < ((table_start << PAGE_SHIFT) + tables_space))) --- diff --git a/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c b/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c index 2c1a35e03a..4bf2a703be 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -391,24 +392,42 @@ void pgd_free(pgd_t *pgd) #ifndef CONFIG_XEN_SHADOW_MODE void make_lowmem_mmu_page_readonly(void *va) { - pte_t *pte = virt_to_ptep(va); - int rc = HYPERVISOR_update_va_mapping( + pte_t *pte; + int rc; + + if (xen_feature(writable_mmu_structures)) + return; + + pte = virt_to_ptep(va); + rc = HYPERVISOR_update_va_mapping( (unsigned long)va, pte_wrprotect(*pte), 0); BUG_ON(rc); } void make_lowmem_mmu_page_writable(void *va) { - pte_t *pte = virt_to_ptep(va); - int rc = HYPERVISOR_update_va_mapping( + pte_t *pte; + int rc; + + if (xen_feature(writable_mmu_structures)) + return; + + pte = virt_to_ptep(va); + rc = HYPERVISOR_update_va_mapping( (unsigned long)va, pte_mkwrite(*pte), 0); BUG_ON(rc); } void make_mmu_page_readonly(void *va) { - pte_t *pte = virt_to_ptep(va); - int rc = HYPERVISOR_update_va_mapping( + pte_t *pte; + int rc; + + if (xen_feature(writable_mmu_structures)) + return; + + pte = virt_to_ptep(va); + rc = HYPERVISOR_update_va_mapping( (unsigned long)va, pte_wrprotect(*pte), 0); if (rc) /* fallback? */ xen_l1_entry_update(pte, pte_wrprotect(*pte)); @@ -426,8 +445,14 @@ void make_mmu_page_readonly(void *va) void make_mmu_page_writable(void *va) { - pte_t *pte = virt_to_ptep(va); - int rc = HYPERVISOR_update_va_mapping( + pte_t *pte; + int rc; + + if (xen_feature(writable_mmu_structures)) + return; + + pte = virt_to_ptep(va); + rc = HYPERVISOR_update_va_mapping( (unsigned long)va, pte_mkwrite(*pte), 0); if (rc) /* fallback? */ xen_l1_entry_update(pte, pte_mkwrite(*pte)); @@ -443,6 +468,9 @@ void make_mmu_page_writable(void *va) void make_mmu_pages_readonly(void *va, unsigned int nr) { + if (xen_feature(writable_mmu_structures)) + return; + while (nr-- != 0) { make_mmu_page_readonly(va); va = (void *)((unsigned long)va + PAGE_SIZE); @@ -451,6 +479,8 @@ void make_mmu_pages_readonly(void *va, unsigned int nr) void make_mmu_pages_writable(void *va, unsigned int nr) { + if (xen_feature(writable_mmu_structures)) + return; while (nr-- != 0) { make_mmu_page_writable(va); va = (void *)((unsigned long)va + PAGE_SIZE); diff --git a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c index 69a61199e8..fb614ef453 100644 --- a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c @@ -40,6 +40,8 @@ #include #include +#include + #ifndef Dprintk #define Dprintk(x...) #endif @@ -72,6 +74,9 @@ static void early_make_mmu_page_readonly(void *va) pte_t pte, *ptep; unsigned long *page = (unsigned long *) init_level4_pgt; + if (xen_feature(writable_mmu_structures)) + return; + addr = (unsigned long) page[pgd_index(_va)]; addr_to_page(addr, page); @@ -93,6 +98,9 @@ void make_mmu_page_readonly(void *va) pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep; unsigned long addr = (unsigned long) va; + if (xen_feature(writable_mmu_structures)) + return; + pgd = pgd_offset_k(addr); pud = pud_offset(pgd, addr); pmd = pmd_offset(pud, addr); @@ -111,6 +119,9 @@ void make_mmu_page_writable(void *va) pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep; unsigned long addr = (unsigned long) va; + if (xen_feature(writable_mmu_structures)) + return; + pgd = pgd_offset_k(addr); pud = pud_offset(pgd, addr); pmd = pmd_offset(pud, addr); @@ -126,6 +137,9 @@ void make_mmu_page_writable(void *va) void make_mmu_pages_readonly(void *va, unsigned nr) { + if (xen_feature(writable_mmu_structures)) + return; + while (nr-- != 0) { make_mmu_page_readonly(va); va = (void*)((unsigned long)va + PAGE_SIZE); @@ -134,6 +148,8 @@ void make_mmu_pages_readonly(void *va, unsigned nr) void make_mmu_pages_writable(void *va, unsigned nr) { + if (xen_feature(writable_mmu_structures)) + return; while (nr-- != 0) { make_mmu_page_writable(va); va = (void*)((unsigned long)va + PAGE_SIZE); @@ -385,6 +401,9 @@ static inline int make_readonly(unsigned long paddr) { int readonly = 0; + if (xen_feature(writable_mmu_structures)) + return 0; + /* Make old and new page tables read-only. */ if ((paddr >= (xen_start_info->pt_base - __START_KERNEL_map)) && (paddr < ((table_start << PAGE_SHIFT) + tables_space))) diff --git a/xen/include/public/version.h b/xen/include/public/version.h index 8259f1856f..b734a4f560 100644 --- a/xen/include/public/version.h +++ b/xen/include/public/version.h @@ -45,6 +45,9 @@ typedef struct xen_feature_info { uint32_t submap; /* OUT: 32-bit submap */ } xen_feature_info_t; +#define _XENFEAT_writable_mmu_structures 0 +#define XENFEAT_writable_mmu_structures (1UL<<_XENFEAT_writable_mmu_structures) + #define XENFEAT_NR_SUBMAPS 1 #endif /* __XEN_PUBLIC_VERSION_H__ */